package A_review.review5_8;

import A_review.review4_21.SlidingWindow;

import java.util.HashMap;

public class SlideWindow {

    public String minWindow(String s, String t) {
        //  CKG TODO 2023/5/8:  Character
        HashMap<Character, Integer> need = new HashMap<>();
        for (char a: t.toCharArray()) {
            need.put(a,need.getOrDefault(a,0)+1);
        }
        HashMap<Character, Integer> window = new HashMap<>();

        int left=0;
        int right=0;
        //  CKG TODO 2023/5/8: 此处应该为s的length
        int size=s.length();
        int minLen=size+1;
        int valid=0;
        //  CKG TODO 2023/5/8: 没有定义这个start
        int start=0;

       while (right<size){
           char c = s.charAt(right);
           right++;
           if (need.containsKey(c)){
               window.put(c,window.getOrDefault(c,0)+1);
               //  CKG TODO 2023/5/8: 这里应该使用.equals()
               if (window.get(c).equals(need.get(c))){
                   valid++;
               }
           }
           int needSize = need.size();
           //  CKG TODO 2023/5/8: 这里使用 while  不是if
           while (valid==needSize){
               //  CKG TODO 2023/5/8:   下面这个while 不需要了  因为只要valid
               //  CKG TODO 2023/5/8: 还等于needSize 就一直循环 left一直向右移动
//               while (left<right){
                   char c1 = s.charAt(left);
                   left++;
                   if (need.containsKey(c1)){
                       //  CKG TODO 2023/5/8: 此处必须判断  因为有的window里面的元素可能含有大于need的元素的个数
                       if (window.get(c1).equals(need.get(c1))){
                           //  CKG TODO 2023/4/21: 我错误写在了这里 就不行 打印出来的结果为ANC   window.put(c,window.get(c)-1);
                           valid--;
                       }
                       window.put(c1,window.get(c1)-1);
                   }
                   if (valid!=needSize){
                       //  CKG TODO 2023/5/8:  这块忘记怎么写了   start  minLen是需要的  用来保存最小值
                        if (right-left+1<minLen){
                            start=left-1;
                            minLen=right-left+1;
                        }
                   }
               }
           }
       return   minLen==size+1?"":s.substring(start,start+minLen);
    }




    public static void main(String[] args) {
        SlideWindow slidingWindow = new SlideWindow();
        System.out.println(slidingWindow.minWindow("ADOBECODEBANC", "ABC"));
    }



}
